This commit adds a cell_background property for cell renderers. With this
authorKristian Rietveld <kris@gtk.org>
Tue, 23 Apr 2002 16:39:01 +0000 (16:39 +0000)
committerKristian Rietveld <kristian@src.gnome.org>
Tue, 23 Apr 2002 16:39:01 +0000 (16:39 +0000)
Tue Apr 23 18:35:34 2002  Kristian Rietveld  <kris@gtk.org>

        This commit adds a cell_background property for cell renderers. With
        this property you can make your TreeView look incredibly ugly.

        * gtk/gtkcellrenderer.c: add cell_background, cell_background_gdk and
        cell_background_set properties,
        (set_cell_bg_color): new function,
        (gtk_cell_renderer_get_property), (gtk_cell_renderer_set_property):
        support for new properties,
        (gtk_cell_renderer_render): render a background when set.

        * gtk/gtkcellrenderer.h: add cell_background_set and cell_background
        fields.

        * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_cell_process_action):
        when rendering, pass in just the background_area of the cell and not
        the background_area of the entire column.

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtkcellrenderer.c
gtk/gtkcellrenderer.h
gtk/gtktreeviewcolumn.c

index 5f02ccdd77503c55d29aad6f2857f35ccd5e4c74..cf0857726429340902e24b834ed46c02676571dc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+Tue Apr 23 18:35:34 2002  Kristian Rietveld  <kris@gtk.org>
+
+       This commit adds a cell_background property for cell renderers. With
+       this property you can make your TreeView look incredibly ugly.
+
+       * gtk/gtkcellrenderer.c: add cell_background, cell_background_gdk and
+       cell_background_set properties,
+       (set_cell_bg_color): new function,
+       (gtk_cell_renderer_get_property), (gtk_cell_renderer_set_property):
+       support for new properties,
+       (gtk_cell_renderer_render): render a background when set.
+
+       * gtk/gtkcellrenderer.h: add cell_background_set and cell_background
+       fields.
+
+       * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_cell_process_action):
+       when rendering, pass in just the background_area of the cell and not
+       the background_area of the entire column.
+
 2002-04-22  Anders Carlsson  <andersca@gnu.org>
 
        * gtk/gtkentry.c (gtk_entry_drag_data_get): Use 
@@ -18,7 +37,6 @@ Mon Apr 22 19:24:29 2002  Kristian Rietveld  <kris@gtk.org>
        icon stuff in the cellrendererpixbuf instead of its own stock icon
        rendering code.
 
-
 2002-04-21  Alexander Larsson  <alla@lysator.liu.se>
 
        * gdk/x11/gdkwindow-x11.c (gdk_window_reparent):
index 5f02ccdd77503c55d29aad6f2857f35ccd5e4c74..cf0857726429340902e24b834ed46c02676571dc 100644 (file)
@@ -1,3 +1,22 @@
+Tue Apr 23 18:35:34 2002  Kristian Rietveld  <kris@gtk.org>
+
+       This commit adds a cell_background property for cell renderers. With
+       this property you can make your TreeView look incredibly ugly.
+
+       * gtk/gtkcellrenderer.c: add cell_background, cell_background_gdk and
+       cell_background_set properties,
+       (set_cell_bg_color): new function,
+       (gtk_cell_renderer_get_property), (gtk_cell_renderer_set_property):
+       support for new properties,
+       (gtk_cell_renderer_render): render a background when set.
+
+       * gtk/gtkcellrenderer.h: add cell_background_set and cell_background
+       fields.
+
+       * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_cell_process_action):
+       when rendering, pass in just the background_area of the cell and not
+       the background_area of the entire column.
+
 2002-04-22  Anders Carlsson  <andersca@gnu.org>
 
        * gtk/gtkentry.c (gtk_entry_drag_data_get): Use 
@@ -18,7 +37,6 @@ Mon Apr 22 19:24:29 2002  Kristian Rietveld  <kris@gtk.org>
        icon stuff in the cellrendererpixbuf instead of its own stock icon
        rendering code.
 
-
 2002-04-21  Alexander Larsson  <alla@lysator.liu.se>
 
        * gdk/x11/gdkwindow-x11.c (gdk_window_reparent):
index 5f02ccdd77503c55d29aad6f2857f35ccd5e4c74..cf0857726429340902e24b834ed46c02676571dc 100644 (file)
@@ -1,3 +1,22 @@
+Tue Apr 23 18:35:34 2002  Kristian Rietveld  <kris@gtk.org>
+
+       This commit adds a cell_background property for cell renderers. With
+       this property you can make your TreeView look incredibly ugly.
+
+       * gtk/gtkcellrenderer.c: add cell_background, cell_background_gdk and
+       cell_background_set properties,
+       (set_cell_bg_color): new function,
+       (gtk_cell_renderer_get_property), (gtk_cell_renderer_set_property):
+       support for new properties,
+       (gtk_cell_renderer_render): render a background when set.
+
+       * gtk/gtkcellrenderer.h: add cell_background_set and cell_background
+       fields.
+
+       * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_cell_process_action):
+       when rendering, pass in just the background_area of the cell and not
+       the background_area of the entire column.
+
 2002-04-22  Anders Carlsson  <andersca@gnu.org>
 
        * gtk/gtkentry.c (gtk_entry_drag_data_get): Use 
@@ -18,7 +37,6 @@ Mon Apr 22 19:24:29 2002  Kristian Rietveld  <kris@gtk.org>
        icon stuff in the cellrendererpixbuf instead of its own stock icon
        rendering code.
 
-
 2002-04-21  Alexander Larsson  <alla@lysator.liu.se>
 
        * gdk/x11/gdkwindow-x11.c (gdk_window_reparent):
index 5f02ccdd77503c55d29aad6f2857f35ccd5e4c74..cf0857726429340902e24b834ed46c02676571dc 100644 (file)
@@ -1,3 +1,22 @@
+Tue Apr 23 18:35:34 2002  Kristian Rietveld  <kris@gtk.org>
+
+       This commit adds a cell_background property for cell renderers. With
+       this property you can make your TreeView look incredibly ugly.
+
+       * gtk/gtkcellrenderer.c: add cell_background, cell_background_gdk and
+       cell_background_set properties,
+       (set_cell_bg_color): new function,
+       (gtk_cell_renderer_get_property), (gtk_cell_renderer_set_property):
+       support for new properties,
+       (gtk_cell_renderer_render): render a background when set.
+
+       * gtk/gtkcellrenderer.h: add cell_background_set and cell_background
+       fields.
+
+       * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_cell_process_action):
+       when rendering, pass in just the background_area of the cell and not
+       the background_area of the entire column.
+
 2002-04-22  Anders Carlsson  <andersca@gnu.org>
 
        * gtk/gtkentry.c (gtk_entry_drag_data_get): Use 
@@ -18,7 +37,6 @@ Mon Apr 22 19:24:29 2002  Kristian Rietveld  <kris@gtk.org>
        icon stuff in the cellrendererpixbuf instead of its own stock icon
        rendering code.
 
-
 2002-04-21  Alexander Larsson  <alla@lysator.liu.se>
 
        * gdk/x11/gdkwindow-x11.c (gdk_window_reparent):
index 5f02ccdd77503c55d29aad6f2857f35ccd5e4c74..cf0857726429340902e24b834ed46c02676571dc 100644 (file)
@@ -1,3 +1,22 @@
+Tue Apr 23 18:35:34 2002  Kristian Rietveld  <kris@gtk.org>
+
+       This commit adds a cell_background property for cell renderers. With
+       this property you can make your TreeView look incredibly ugly.
+
+       * gtk/gtkcellrenderer.c: add cell_background, cell_background_gdk and
+       cell_background_set properties,
+       (set_cell_bg_color): new function,
+       (gtk_cell_renderer_get_property), (gtk_cell_renderer_set_property):
+       support for new properties,
+       (gtk_cell_renderer_render): render a background when set.
+
+       * gtk/gtkcellrenderer.h: add cell_background_set and cell_background
+       fields.
+
+       * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_cell_process_action):
+       when rendering, pass in just the background_area of the cell and not
+       the background_area of the entire column.
+
 2002-04-22  Anders Carlsson  <andersca@gnu.org>
 
        * gtk/gtkentry.c (gtk_entry_drag_data_get): Use 
@@ -18,7 +37,6 @@ Mon Apr 22 19:24:29 2002  Kristian Rietveld  <kris@gtk.org>
        icon stuff in the cellrendererpixbuf instead of its own stock icon
        rendering code.
 
-
 2002-04-21  Alexander Larsson  <alla@lysator.liu.se>
 
        * gdk/x11/gdkwindow-x11.c (gdk_window_reparent):
index 5f02ccdd77503c55d29aad6f2857f35ccd5e4c74..cf0857726429340902e24b834ed46c02676571dc 100644 (file)
@@ -1,3 +1,22 @@
+Tue Apr 23 18:35:34 2002  Kristian Rietveld  <kris@gtk.org>
+
+       This commit adds a cell_background property for cell renderers. With
+       this property you can make your TreeView look incredibly ugly.
+
+       * gtk/gtkcellrenderer.c: add cell_background, cell_background_gdk and
+       cell_background_set properties,
+       (set_cell_bg_color): new function,
+       (gtk_cell_renderer_get_property), (gtk_cell_renderer_set_property):
+       support for new properties,
+       (gtk_cell_renderer_render): render a background when set.
+
+       * gtk/gtkcellrenderer.h: add cell_background_set and cell_background
+       fields.
+
+       * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_cell_process_action):
+       when rendering, pass in just the background_area of the cell and not
+       the background_area of the entire column.
+
 2002-04-22  Anders Carlsson  <andersca@gnu.org>
 
        * gtk/gtkentry.c (gtk_entry_drag_data_get): Use 
@@ -18,7 +37,6 @@ Mon Apr 22 19:24:29 2002  Kristian Rietveld  <kris@gtk.org>
        icon stuff in the cellrendererpixbuf instead of its own stock icon
        rendering code.
 
-
 2002-04-21  Alexander Larsson  <alla@lysator.liu.se>
 
        * gdk/x11/gdkwindow-x11.c (gdk_window_reparent):
index 8b1396622678f441067c380f4b14a5a653f43637..6327da9eb380bd158e0a07b45edfc2b39fd790c2 100644 (file)
@@ -30,6 +30,8 @@ static void gtk_cell_renderer_set_property  (GObject              *object,
                                             guint                 param_id,
                                             const GValue         *value,
                                             GParamSpec           *pspec);
+static void set_cell_bg_color               (GtkCellRenderer      *cell,
+                                            GdkColor             *color);
 
 
 enum {
@@ -43,7 +45,10 @@ enum {
   PROP_WIDTH,
   PROP_HEIGHT,
   PROP_IS_EXPANDER,
-  PROP_IS_EXPANDED
+  PROP_IS_EXPANDED,
+  PROP_CELL_BACKGROUND,
+  PROP_CELL_BACKGROUND_GDK,
+  PROP_CELL_BACKGROUND_SET
 };
 
 
@@ -200,6 +205,29 @@ gtk_cell_renderer_class_init (GtkCellRendererClass *class)
                                                         FALSE,
                                                         G_PARAM_READABLE |
                                                         G_PARAM_WRITABLE));
+
+  g_object_class_install_property (object_class,
+                                  PROP_CELL_BACKGROUND,
+                                  g_param_spec_string ("cell_background",
+                                                       _("Cell background color name"),
+                                                       _("Cell background color as a string"),
+                                                       NULL,
+                                                       G_PARAM_WRITABLE));
+
+  g_object_class_install_property (object_class,
+                                  PROP_CELL_BACKGROUND_GDK,
+                                  g_param_spec_boxed ("cell_background_gdk",
+                                                      _("Cell background color"),
+                                                      _("Cell background color as a GdkColor"),
+                                                      GDK_TYPE_COLOR,
+                                                      G_PARAM_READABLE | G_PARAM_WRITABLE));
+
+
+#define ADD_SET_PROP(propname, propval, nick, blurb) g_object_class_install_property (object_class, propval, g_param_spec_boolean (propname, nick, blurb, FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE))
+
+  ADD_SET_PROP ("cell_background_set", PROP_CELL_BACKGROUND_SET,
+                _("Cell background set"),
+                _("Whether this tag affects the cell background color"));
 }
 
 static void
@@ -242,6 +270,21 @@ gtk_cell_renderer_get_property (GObject     *object,
     case PROP_IS_EXPANDED:
       g_value_set_int (value, cell->is_expanded);
       break;
+    case PROP_CELL_BACKGROUND_GDK:
+      {
+       GdkColor color;
+
+       color.red = cell->cell_background.red;
+       color.green = cell->cell_background.green;
+       color.blue = cell->cell_background.blue;
+
+       g_value_set_boxed (value, &color);
+      }
+      break;
+    case PROP_CELL_BACKGROUND_SET:
+      g_value_set_boolean (value, cell->cell_background_set);
+      break;
+    case PROP_CELL_BACKGROUND:
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
       break;
@@ -289,12 +332,58 @@ gtk_cell_renderer_set_property (GObject      *object,
     case PROP_IS_EXPANDED:
       cell->is_expanded = g_value_get_boolean (value);
       break;
+    case PROP_CELL_BACKGROUND:
+      {
+       GdkColor color;
+
+       if (!g_value_get_string (value))
+         set_cell_bg_color (cell, NULL);
+       else if (gdk_color_parse (g_value_get_string (value), &color))
+         set_cell_bg_color (cell, &color);
+       else
+         g_warning ("Don't know color `%s'", g_value_get_string (value));
+
+       g_object_notify (object, "cell_background_gdk");
+      }
+      break;
+    case PROP_CELL_BACKGROUND_GDK:
+      set_cell_bg_color (cell, g_value_get_boxed (value));
+      break;
+    case PROP_CELL_BACKGROUND_SET:
+      cell->cell_background_set = g_value_get_boolean (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
       break;
     }
 }
 
+static void
+set_cell_bg_color (GtkCellRenderer *cell,
+                  GdkColor        *color)
+{
+  if (color)
+    {
+      if (!cell->cell_background_set)
+        {
+         cell->cell_background_set = TRUE;
+         g_object_notify (G_OBJECT (cell), "cell_background_set");
+       }
+
+      cell->cell_background.red = color->red;
+      cell->cell_background.green = color->green;
+      cell->cell_background.blue = color->blue;
+    }
+  else
+    {
+      if (cell->cell_background_set)
+        {
+         cell->cell_background_set = FALSE;
+         g_object_notify (G_OBJECT (cell), "cell_background_set");
+       }
+    }
+}
+
 /**
  * gtk_cell_renderer_get_size:
  * @cell: a #GtkCellRenderer
@@ -369,9 +458,30 @@ gtk_cell_renderer_render (GtkCellRenderer     *cell,
                          GdkRectangle        *expose_area,
                          GtkCellRendererState flags)
 {
+  gboolean selected = FALSE;
+
   g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
   g_return_if_fail (GTK_CELL_RENDERER_GET_CLASS (cell)->render != NULL);
 
+  selected = (flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED;
+
+  if (cell->cell_background_set && !selected)
+    {
+      GdkColor color;
+      GdkGC *gc;
+
+      color.red = cell->cell_background.red;
+      color.green = cell->cell_background.green;
+      color.blue = cell->cell_background.blue;
+
+      gc = gdk_gc_new (window);
+      gdk_gc_set_rgb_fg_color (gc, &color);
+      gdk_draw_rectangle (window, gc, TRUE,
+                          background_area->x, background_area->y,
+                          background_area->width, background_area->height);
+      g_object_unref (G_OBJECT (gc));
+    }
+
   GTK_CELL_RENDERER_GET_CLASS (cell)->render (cell,
                                              window,
                                              widget,
index ce9085d8b506fc8dcf2e022463fcbf7657552bc0..16e9ca97a5b89ffa88394926f51d6b43fa91506d 100644 (file)
@@ -69,6 +69,10 @@ struct _GtkCellRenderer
   guint visible : 1;
   guint is_expander : 1;
   guint is_expanded : 1;
+
+  guint cell_background_set : 1;
+
+  GdkColor cell_background;
 };
 
 struct _GtkCellRendererClass
index 6f7eb3e50d34173c8dc3434b7eb5d1f3d3cafab9..d5db622c56b3975f56680be6cc22b1c472f10ae2 100644 (file)
@@ -2326,11 +2326,13 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn  *tree_column,
 {
   GList *list;
   GdkRectangle real_cell_area;
+  GdkRectangle real_background_area;
   gint expand_cell_count = 0;
   gint full_requested_width = 0;
   gint extra_space;
   gint min_x, min_y, max_x, max_y;
   gint focus_line_width;
+  gint dx;
 
   min_x = G_MAXINT;
   min_y = G_MAXINT;
@@ -2338,6 +2340,8 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn  *tree_column,
   max_y = 0;
 
   real_cell_area = *cell_area;
+  real_background_area = *background_area;
+  dx = real_cell_area.x - real_background_area.x;
 
   gtk_widget_style_get (GTK_WIDGET (tree_column->tree_view),
                        "focus-line-width", &focus_line_width,
@@ -2373,12 +2377,18 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn  *tree_column,
        (info->expand?extra_space:0);
       info->real_width = real_cell_area.width;
       real_cell_area.x += focus_line_width;
+
+      real_background_area.width = real_cell_area.width;
+      real_background_area.x += focus_line_width;
+      if (!list->prev)
+       real_background_area.width += dx;
+
       if (action == CELL_ACTION_RENDER)
        {
          gtk_cell_renderer_render (info->cell,
                                    window,
                                    tree_column->tree_view,
-                                   background_area,
+                                   &real_background_area,
                                    &real_cell_area,
                                    expose_area,
                                    flags);
@@ -2457,6 +2467,7 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn  *tree_column,
            }
        }
       real_cell_area.x += (info->requested_width + tree_column->spacing);
+      real_background_area.x += (info->requested_width + tree_column->spacing);
     }
   for (list = g_list_last (tree_column->cell_list); list; list = list->prev)
     {
@@ -2471,12 +2482,13 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn  *tree_column,
       real_cell_area.width = info->requested_width +
        (info->expand?extra_space:0);
       info->real_width = real_cell_area.width;
+      real_background_area.width = real_background_area.width;
       if (action == CELL_ACTION_RENDER)
        {
          gtk_cell_renderer_render (info->cell,
                                    window,
                                    tree_column->tree_view,
-                                   background_area,
+                                   &real_background_area,
                                    &real_cell_area,
                                    expose_area,
                                    flags);
@@ -2501,6 +2513,7 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn  *tree_column,
            max_y = real_cell_area.y + y_offset + height;
        }
       real_cell_area.x += (info->requested_width + tree_column->spacing);
+      real_background_area.x += (info->requested_width + tree_column->spacing);
     }
 
   if (action == CELL_ACTION_FOCUS)